package org.wedding.center.util;


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * 二维码工具类
 */
public class QRCodeGenerator {
    /**
     * 永久二维码
     *
     * @param url
     * @param width
     * @param height
     */
    public static ByteArrayInputStream  generateQRCodeImage(String url, int width, int height) {
        try {
            // 创建一个QRCodeWriter实例，用于生成二维码
            QRCodeWriter qrCodeWriter = new QRCodeWriter();

            // 创建一个提示配置对象，用于设置二维码的相关参数
            Map<EncodeHintType, Object> hints = new HashMap<>();

            // 设置二维码的纠错级别为L（低级纠错），可以承受约7%的数据丢失
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

            // 使用QRCodeWriter实例生成二维码的BitMatrix（二维码的矩阵表示）
            BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, width, height, hints);

            // 创建一个BufferedImage对象，图像的宽度和高度由width和height变量决定
            // 图像类型为RGB（每个像素由红、绿、蓝三种颜色组成）
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            // 创建图形上下文对象
            bufferedImage.createGraphics();

            // 获取BufferedImage的Graphics2D对象，准备绘制二维码图像
            Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();

            // 设置背景色为白色
            graphics.setColor(java.awt.Color.WHITE);

            // 填充整个图像的背景为白色
            graphics.fillRect(0, 0, width, height);

            // 设置前景色为黑色，用来绘制二维码
            graphics.setColor(java.awt.Color.BLACK);

            // 遍历二维码矩阵的每个位置，决定在图像上绘制黑色的方块
            for (int i = 0; i < width; i++) {
                for (int j = 0; j < height; j++) {
                    // 如果二维码矩阵在位置(i, j)上为true，表示此位置应该是黑色
                    if (bitMatrix.get(i, j)) {
                        // 绘制一个1x1像素的黑色矩形（二维码的黑色模块）
                        graphics.fillRect(i, j, 1, 1);
                    }
                }
            }


            // 将生成的二维码图像保存为PNG格式，保存路径由filePath指定
            // 直接生成内存流
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", baos);
            return new ByteArrayInputStream(baos.toByteArray());
        } catch (Exception e) {
            // 捕获二维码生成过程中的异常，并打印堆栈信息
            e.printStackTrace();
            return null;
        }
    }
}

